package monopoli.game;

import java.util.ArrayList;
import java.util.Iterator;
import monopoli.Monopoli;
import monopoli.gui.GUI;


public class GameToGUI implements GameToGUIInterface {

    int idGiocatore;

    public GameToGUI () {
    }

    @Override
    public void richiestaPartecipaPartita () {

        GUI gui = Monopoli.getMonopoliGUI();
        Partita partita = Monopoli.getMonopoliPartita();

        gui.infoPlayer("Richiesta Avvio Partita");
        partita.inizializzaPartita();

        idGiocatore = partita.partecipa();
        partita.comunicaGiocatore(idGiocatore);   
    }

    @Override
    public void avvioGioco (String nomeGiocatore) {

        Partita partita = Monopoli.getMonopoliPartita();

        Giocatore g = partita.ricavaGiocatoreSessione();
        g.setNome(nomeGiocatore);
        Monopoli.getMonopoliPartita().comunicaNome(nomeGiocatore, idGiocatore);
        Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Partecipa alla partita il giocatore " + idGiocatore + " - " + nomeGiocatore);
        
        //Aggiorna a video i giocatori
        ArrayList<Giocatore> glist = Monopoli.getMonopoliPartita().getGiocatore();
        Iterator it = glist.iterator();
        ArrayList<String> s = new ArrayList<String>();
        while(it.hasNext()) {
            g = (Giocatore) it.next();
            s.add(g.getNome());
        }
        Monopoli.getMonopoliGUI().AggiornaSommario("giocatori", s);
        
    }
    
    @Override
    public void completaAvviaGioco() {
        Monopoli.getMonopoliPartita().completaInizializzazionePartita();
    }

    @Override
    public void scegliPedina (int pedina) {
        Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Scelta la pedina n°" + pedina);
        Monopoli.getMonopoliPartita().comunicaPedina(pedina,idGiocatore);
    }

    @Override
    public int lanciaDadi () {
        
        int res;

        ArrayList dadi  = Monopoli.getMonopoliPartita().getDado();
        Dado d1 = (Dado) dadi.get(0);
        Dado d2 = (Dado) dadi.get(1);
        res = d1.lancia() + d2.lancia();
        Monopoli.getMonopoliGUI().debugMessage("[DBG_game] Risultato lancio dadi: " + res);
        return res;
        
    }

    @Override
    public void passaTurno () {
        Monopoli.getMonopoliPartita().passaTurno();
    }

    @Override
    public void acquista () {

        boolean res = Monopoli.getMonopoliPartita().acquistaProprieta();
        if (res) {
        String s = "COMPRATA PROPRIETA' :";
        s += "\n" + Monopoli.getMonopoliPartita().stampaCasellaAttuale();
        Monopoli.getMonopoliGUI().infoPlayer(s);
        }
        else
            Monopoli.getMonopoliGUI().infoPlayer("ACQUISTO IMPOSSIBILE. NON SI E' IN POSSESSO DELLA SOMMA NECESSARIA");

        //SE LA TRANSAZIONE VA A BUON FINE SI PUO' EVIDENZIARE LA PROPRIETA' ACQUISTATA PER UN PO'
    }

    @Override
    public void vendi () {
    }

    @Override
    public void paga () {
    }

    @Override
    public void rilanciaAsta () {
    }

    @Override
    public void rinunciaAsta () {
    }

    @Override
    public void proponiScambio () {
    }

    @Override
    public void accettaScambio () {
    }
    
    @Override
    public String ottieniProprieta() {
        //In base al numero dei giocatori iniziali ricavo le prorietà
        ArrayList<String> possedimenti = new ArrayList<String>();
        String s;
        ArrayList carte = Monopoli.getMonopoliPartita().getMazzoProprieta().getCarteMazzo(5);
        Iterator it = carte.iterator();
        String retString = new String();
        Giocatore g = Monopoli.getMonopoliPartita().ricavaGiocatoreSessione();
        g.setProprieta(carte);


        while(it.hasNext()) {
            Proprieta c = (Proprieta)it.next();
            c.setProprietario(idGiocatore);
            s = c.getNomeEsteso();
            retString = retString + s + ';' + '\n';
            possedimenti.add(s);
            //mando notifica a communication
            Monopoli.getMonopoliCommunication().notificaPossessoProprieta(idGiocatore, c.getId());


        }
        Monopoli.getMonopoliGUI().AggiornaSommario("possedimenti", possedimenti);

        this.aggiornaSoldi();


        
        return retString;
    }


    public void aggiungiCasa() {
        boolean res = Monopoli.getMonopoliPartita().aggiungiCasa();
        if (res) {
        String s = "ACQUISTATA CASA!";
        s += "\n" + Monopoli.getMonopoliPartita().stampaCasellaAttuale();
        Monopoli.getMonopoliGUI().infoPlayer(s);
        int posizione =Monopoli.getMonopoliPartita().getCasellaAttuale();
        Monopoli.getMonopoliGUI().aggiungiCasa(posizione);
        Monopoli.getMonopoliGUI().AggiornaTabellone();
        Monopoli.getMonopoliCommunication().notificaCostruzioneEdificio(Monopoli.getMonopoliPartita().getGiocatoreSessione(),posizione,1);
        }
        else
             Monopoli.getMonopoliGUI().infoPlayer("ACQUISTO NON POSSIBILE: NON SI POSSIEDE LA SOMMA NECESSARIA");
    }

    public void aggiungiHotel() {
        boolean res = Monopoli.getMonopoliPartita().aggiungiHotel();
        if(res) {
        String s = "ACQUISTATO HOTEL!";
        s += "\n" + Monopoli.getMonopoliPartita().stampaCasellaAttuale();
        Monopoli.getMonopoliGUI().infoPlayer(s);
        int posizione =Monopoli.getMonopoliPartita().getCasellaAttuale();
        Monopoli.getMonopoliGUI().aggiungiHotel(posizione);
        Monopoli.getMonopoliGUI().AggiornaTabellone();
        Monopoli.getMonopoliCommunication().notificaCostruzioneEdificio(Monopoli.getMonopoliPartita().getGiocatoreSessione(),posizione,2);
        }
        else
             Monopoli.getMonopoliGUI().infoPlayer("ACQUISTO NON POSSIBILE: NON SI POSSIEDE LA SOMMA NECESSARIA");
    }


    public void aggiornaSoldi() {
     //aggiorno anche le banconote
        ArrayList<String> banconote = new ArrayList<String>();
        ArrayList<Banconota> soldi = Monopoli.getMonopoliPartita().ricavaGiocatoreSessione().getBanconote();
        String space = new String();
         String s1 = new String();
        Iterator it2 = soldi.iterator();
        while(it2.hasNext()) {
            Banconota b = (Banconota)it2.next();
            if (b.getValue()==100)
                space = "     ";
            else if(b.getValue() == 1000 || b.getValue()== 5000)
                    space= "   ";
            else
                space= " ";
            if (b.getAmount() < 10)
                 s1 = "€"+ b.getValue() + space + ": N°" + "0" + b.getAmount();
            else
                 s1 ="€"+ b.getValue() +   space + ": N°" + b.getAmount();
            banconote.add(s1);
        }
        Monopoli.getMonopoliGUI().AggiornaSommario("soldi", banconote);
    }
}

